#include<bits/stdc++.h>
using namespace std;
const int N=310,M=N*N;
struct ok{
    int u,v,w;
    bool operator <(const ok &A) const{return w<A.w;}
}edge[M];
int n,m,q,st,fa[N],num[N],road[N][N];
int first[N],to[M],nxt[M],lth[M],cnt;
bool sub1=1,sub2=1,sub3=1,vis[N];
mt19937 g(time(0));
int Rd(int mod)
{
    long long k=g();
    k=abs(k);
    return k%mod+1;
}
inline void inc(int x,int y,int l) {nxt[++cnt]=first[x],to[cnt]=y,first[x]=cnt,lth[cnt]=l;}
void dfs(int x,int fr)
{
    vis[x]=1;
    for(int i=first[x],v;i;i=nxt[i])
        if((v=to[i])!=fr) dfs(v,x);
}
void dfs2(int x,int S,int ff,int &res)
{
    vis[x]=1;
    int srt=0,To;
    for(int i=first[x],v;i;i=nxt[i])
        if(!vis[v=to[i]]&&lth[i]<S) ++srt;
        else if(v==ff&&lth[i]<S) ++srt;
    if(!srt) return;
    To=Rd(srt);srt=0;
    for(int i=first[x],v;i;i=nxt[i])
    {
        if(!vis[v=to[i]]&&lth[i]<S) ++srt;
        else if(v==ff&&lth[i]<S) ++srt;
        if(To==srt)
        {
            res+=lth[i];
            if(!vis[v]) dfs2(v,S,ff,res);
            else res-=S;
        }
    }
}
int main()
{
    freopen("journey.in","r",stdin);
    freopen("journey.out","w",stdout);
    ios::sync_with_stdio(0);
    cin>>n>>m>>q;
    if(!q) return 0;
    int u,v,w;
    for(int i=1;i<=m;i++)
    {
        cin>>u>>v>>w,inc(u,v,w);
        edge[i]=(ok){u,v,w};
        sub1&=(u+1==v);
        sub2&=(u%n+1==v);
    }
    sort(edge+1,edge+m+1);
    int x,res;
    if(sub1||sub2)
    {
        while(q--)
        {
            cin>>x;
            res=n*x;
            for(int i=1;i<=m;i++)
            {
                if(edge[i].w>=x) break;
                res+=edge[i].w-x;
            }
            cout<<res<<'\n';
        }
        return 0;
    }
    if(m==n-1)
    {
        dfs(1,0);
        for(int i=1;i<=n;i++)
            if(!vis[i]) sub3=0;
    }
    else sub3=0;
    if(sub3)
    {
        while(q--)
        {
            cin>>x;
            res=n*x;
            for(int i=1;i<=n;i++) vis[i]=0;
            for(int i=1;i<=m;i++)
            {
                if(edge[i].w>=x) break;
                if(!vis[edge[i].u])
                    vis[edge[i].u]=1,res+=(edge[i].w-x);
            }
            cout<<res<<'\n';
        }
        return 0;
    }
    while(q--)
    {
        cin>>x;
        res=n*x;
        for(int i=1;i<=1000;i++)
        {
            int ans=0;
            for(int j=1;j<=n;j++) vis[j]=0;
            for(int j=1;j<=n;j++)
                if(!vis[j]) ans+=x,dfs2(j,x,j,ans);
            res=min(res,ans);
        }
        cout<<res<<'\n';
    }
    return 0;
}